GlobalExceptionHandlerpackage com.gxa.stu.header;



import com.gxa.stu.commin.BizException;
import com.gxa.stu.commin.ExceptionCode;
import com.gxa.stu.commin.JsonResult;
import com.gxa.stu.util.ResponseUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;


/**
 * 全局异常处理器
 * @ControllerAdvice: 被Spring管理的bean,对所有的控制器进行aop的切入
 * 作用: 专门对controller中的异常进行处理,service/dao中的异常要集中抛给controller
 *
 * 且当前类可以定义所有Controller的方法
 */
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
    /**
     * 集中处理异常的方法
     * @ExceptionHandler 表明该方法是一个异常的处理方法(环绕通知)
     * 作用相当于:
     * try{
     *     method()  // 带有异常的抛出
     * }catch(Throwable e){
     *  e对象可以操作
     * }
     *
     *
     *ExceptionHandler的参数中需要value(默认 {})
     * 注解中只有value属性在赋值的时候可以省略
     * {} 表明是一个数组的赋值方式,单个值的时候可以省略{}
     * 参数类型是Throwable,那么所有的Exception和Error都可以作为参数
     * 表明: ExceptionHandler可以捕获异常和错误
     *
     * 参数throwable会得到异常对象(Spring的注入方法): 多态的处理方式
     *
     */
    @ExceptionHandler(Throwable.class)
    public JsonResult handel(Throwable throwable){
        // 针对业务异常自定义异常
    if (throwable instanceof BizException) {
        String code = ((BizException) throwable).getExceptionCode().getCode();
        String message = ((BizException) throwable).getExceptionCode().getMessage();

        return ResponseUtil.failed(code, message);

//    } else if (throwable instanceof UnknownAccountException) {
//        ErrorCode notLogin = ErrorCode.NOT_LOGIN;
//        return ResponseUtil.failed(notLogin.getCode(), notLogin.getMessage());
//    } else if (throwable instanceof BindException) {//数据校验失败
//
//
    }
//        else if(throwable instanceof UnauthorizedException){
//            ExceptionCode errorCode = .WRONG_PERMISSION;
//            return ResponseUtil.failed(errorCode.getCode(),errorCode.getMessage());
//        }

    else {
        // 针对系统异常
        //System.out.println("这是一个系统异常");
        // 运用流的方法来记录日志
        // TODO: 使用日志框架来完成
        // 获取异常信息，记录日志
        StackTraceElement stackTraceElement = throwable.getStackTrace()[0];
        String className = stackTraceElement.getClassName();
        String fileName = stackTraceElement.getFileName();
        int lineNumber = stackTraceElement.getLineNumber();
        String methodName = stackTraceElement.getMethodName();

        log.error("类名:{},文件名:{},行数:{},办法名:{}", className, fileName, lineNumber, methodName);
       log.error(throwable.toString());
        // 针对系统异常

        ExceptionCode systemError = ExceptionCode.WRONG_SERVER;
        return ResponseUtil.failed(systemError.getCode(), systemError.getMessage());
    }


    }
}
